<?php

namespace Reusify\Helper;

class Number
{
    public static function splitSumToArray(float $total,int $n, float $minValue = 0.01): array
    {
        // 转换成整数
        $totalInt = (int)round($total * 100);
        $minInt   = (int)round($minValue * 100);

        if ($totalInt < $n * $minInt) {
            throw new \InvalidArgumentException("总数太小，无法拆分成满足最小值的数组");
        }

        // 1. 生成全是最小值的数组
        $res = array_fill(0, $n, $minInt);

        // 2. 剩余可分配
        $diff = $totalInt - array_sum($res);

        // 循环随机分配，最小为 1
        while ($diff > 0) {
            $idx = mt_rand(0, $n - 1);
            $res[$idx] += 1;
            $diff -= 1;
        }

        return array_map(fn($v) => $v / 100, $res);
    }


    /**
     * 数字转中文（整数）
     *
     * @param int $num 整数数字
     * @return string 中文表示
     * @throws \InvalidArgumentException
     */
    public static function toChinese(int $num): string
    {
        if ($num < 0) {
            throw new \InvalidArgumentException("不支持负数: $num");
        }

        if ($num === 0) return '零';

        $digits = ['零','一','二','三','四','五','六','七','八','九'];
        $units = ['', '十', '百', '千'];
        $bigUnits = ['', '万', '亿', '兆'];

        return self::convertIntegerToChinese($num, $digits, $units, $bigUnits);
    }

    /**
     * 数字转中文大写
     *
     * @param int $num 整数
     * @return string 中文大写表示
     * @throws \InvalidArgumentException
     */
    public static function toChineseUpper(int $num): string
    {
        if ($num < 0) {
            throw new \InvalidArgumentException("不支持负数: $num");
        }

        if ($num === 0) return '零';

        // 中文大写数字
        $digits = ['零','壹','贰','叁','肆','伍','陆','柒','捌','玖'];
        $units = ['', '拾', '佰', '仟'];
        $bigUnits = ['', '万', '亿', '兆'];

        return self::convertIntegerToChinese($num, $digits, $units, $bigUnits);
    }

    /**
     * 私有方法：通用整数转换逻辑
     */
    private static function convertIntegerToChinese(int $num, array $digits, array $units, array $bigUnits): string
    {
        if ($num === 0) return $digits[0];

        $result = '';
        $numStr = (string)$num;
        $length = strlen($numStr);

        // 从右到左，每4位分为一组
        $groups = [];
        $originalGroups = []; // 保存原始组信息用于零的判断
        while ($length > 0) {
            $groupSize = min(4, $length);
            $group = substr($numStr, $length - $groupSize, $groupSize);
            $groups[] = $group;
            // 补齐到4位用于零的判断
            $originalGroups[] = str_pad($group, 4, '0', STR_PAD_LEFT);
            $length -= $groupSize;
        }

        // 处理每个组
        $lastNonEmptyIndex = -1; // 记录上一个非空组的索引
        for ($i = count($groups) - 1; $i >= 0; $i--) {
            $group = $groups[$i];
            $groupStr = self::convertGroup($group, $digits, $units);

            if ($groupStr !== '') {
                // 检查是否需要添加零
                if ($result !== '' && self::shouldAddZero($originalGroups, $i, $lastNonEmptyIndex)) {
                    $result .= $digits[0]; // 添加"零"
                }

                $result .= $groupStr;

                // 添加大单位（万、亿、兆）
                if ($i > 0) {
                    $result .= $bigUnits[$i];
                }

                $lastNonEmptyIndex = $i;
            }
        }

        // 处理以"一十"开头的情况，如 10 → 十, 11 → 十一
        if (strpos($result, $digits[1] . $units[1]) === 0) {
            $result = mb_substr($result, 1);
        }

        // 处理"零一十万"、"零一十亿"等情况，但不处理"零一十"（没有单位的情况）
        foreach ($bigUnits as $bigUnit) {
            if ($bigUnit !== '') {
                $pattern = $digits[0] . $digits[1] . $units[1] . $bigUnit;
                $replacement = $digits[0] . $units[1] . $bigUnit;
                $result = str_replace($pattern, $replacement, $result);
            }
        }

        return $result;
    }

    /**
     * 转换4位以内的数字组
     */
    private static function convertGroup(string $group, array $digits, array $units): string
    {
        $result = '';
        $length = strlen($group);
        $zeroFlag = false;

        for ($i = 0; $i < $length; $i++) {
            $digit = (int)$group[$i];
            $pos = $length - $i - 1;

            if ($digit === 0) {
                $zeroFlag = true;
            } else {
                // 如果前面有0且当前不是最后一位，需要加"零"
                if ($zeroFlag && $result !== '') {
                    $result .= $digits[0];
                }
                $zeroFlag = false;
                $result .= $digits[$digit] . $units[$pos];
            }
        }

        return $result;
    }

    /**
     * 判断是否需要在组之间添加"零"
     */
    private static function shouldAddZero(array $originalGroups, int $currentIndex, int $lastNonEmptyIndex): bool
    {
        if ($lastNonEmptyIndex === -1) {
            return false;
        }

        $currentGroup = $originalGroups[$currentIndex];

        // 情况1：当前组以0开头且不全为0（如0001, 0010, 0100）
        if (strlen($currentGroup) === 4 && (int)$currentGroup > 0) {
            if ($currentGroup[0] === '0' && (int)$currentGroup < 1000) {
                return true;
            }
        }

        // 情况2：中间跳过了组，但只有当当前组不是个位组或者个位组不是完整的千位数时
        if ($lastNonEmptyIndex - $currentIndex > 1) {
            // 如果是个位组且是完整的千位数（如1000），则不需要零
            if ($currentIndex === 0 && (int)$currentGroup >= 1000) {
                return false;
            }
            return true;
        }

        return false;
    }
}
